const md5 = require('blueimp-md5');
const moment = require('moment');
const db = require('../models/db');
const {imgPath} = require('../public/js/common');
/*sql查询语句返回数组:
根据条件查询出来的结果是数组形式
解构赋值之后通过res.status(201).json返回给前台
*/

/*增删改查返回对象:
返回RowDataPacket对象，对象有一个insertId属性，通常可以拿来查询刚刚修改过的数据
*/

//判断用户在注册的时候填写的邮箱和名称是否有重复的情况，需要防抖的一个操作
exports.list =async (req,res,next)=>{
   /*
   这里有几个坑：
   1.还是sqlStr语句的问题,如果不是数字,需要写成字符串形式,email='${email}',记得加引号
   2.查询返回数组，增删改查返回对象
   */
   try {
      console.log(req.query);
      const {email,nickname} = req.query;
      const sqlStr = `SELECT * FROM users WHERE email='${email}' OR nickname='${nickname}'`
      const [result] = await db.query(sqlStr)
      if(!result){
         return res.status(201).json([])
      }
      // console.log(result);
      const users = await db.query(`SELECT * FROM users WHERE id = ${result.id}`)
      // console.log(users);
      //res.json返回的是数组形式
      res.status(201).json(users)
   } catch(err) {
      next(err)
   }
};

//用户注册
exports.create = async (req,res,next)=>{
   //用户注册需要做两件事情,首先是users新增用户,其次是需要新增该用户对所有评论的点赞情况
   //利用try-catch捕获异常
   try {
      //处理用户新注册
      const body = req.body;
      const sqlStr =
      `INSERT INTO users(username,password,email,nickname,avatar,gender,create_time,modify_time,birthday)
      VALUES('${body.email}',
             '${md5(md5(body.password))}',
             '${body.email}',
             '${body.nickname}',
             'default-avatar.png',
             'male',
             '${moment().format('YYYY-MM-DD HH:mm:ss')}',
             '${moment().format('YYYY-MM-DD HH:mm:ss')}',
             '${moment().format('YYYY-MM-DD HH:mm:ss')}')`;
      const result = await db.query(sqlStr);
      const [users] = await db.query(`SELECT * FROM users WHERE id = ${result.insertId}`);

      //处理该用户对所有评论的likes
      const addLikesSqlStr =
          `INSERT INTO likes(user_id,article_id,comment_id,isLike)
             SELECT ${result.insertId},
             c.article_id,
             c.id,
             0
             FROM comments AS c`;
      await db.query(addLikesSqlStr);
      // console.log(result)
      res.status(201).json(users);
      } catch(err) {
      next(err)
    }
};

//用户个人信息的更新
exports.update = async (req,res,next)=>{
   //利用try-catch捕获异常
   try {
      const {id,nickname,introduce,gender,birthday} = req.body;
      // console.log(req.body);
      const sqlStr =`
         UPDATE users
         SET nickname='${nickname}',
             introduce='${introduce}',
             gender='${gender}',
             birthday='${birthday}',
             modify_time ='${moment().format('YYYY-MM-DD HH:mm:ss')}'
         WHERE id='${id}'
      `;

      const result = await db.query(sqlStr);
      console.log(result);
      const [user] = await db.query(`SELECT * FROM users WHERE id = ${id}`);
      //返回给前端之前处理格式化时间
      user.create_time = moment(user.create_time).format('YYYY-MM-DD HH:mm:ss');
      user.modify_time = moment(user.modify_time).format('YYYY-MM-DD HH:mm:ss');
      user.birthday = moment(user.birthday).format('YYYY-MM-DD HH:mm:ss');
      // console.log(user);
      res.status(201).json(user)
   } catch(err) {
      next(err)
   }

};

//用户头像的更新
exports.imgUpdate = async (req,res,next)=>{
   try {
      //req.body存放了前端formData当中的文本域信息
      console.log(req.body);
      //拿到当前用户id
      const {id}  = req.body;
      //file存放了单个文件的信息
      console.log(req.file);
      //获取经过处理之后的图片名称
      //filename的处理是在multer.diskStorage中配置的
      const {filename} = req.file;
      const sqlStr =
      `
         UPDATE users
         SET avatar='${filename}',
             modify_time ='${moment().format('YYYY-MM-DD HH:mm:ss')}'
         WHERE id='${id}'
      `;
      const result = await db.query(sqlStr);
      console.log(result);
      const [user] = await db.query(`SELECT id,avatar,modify_time FROM users WHERE id = ${id}`);
      //返回给前端之前处理格式化时间
      user.modify_time = moment(user.modify_time).format('YYYY-MM-DD HH:mm:ss');
      user.avatar = imgPath+ user.avatar;
      res.status(201).json(user)
   } catch (err) {
      next(err)
   }
};

//用户密码的修改
exports.password =async (req,res,next)=>{
   try {
      const {id,pass} = req.body;
      console.log(req.body);
      console.log(md5(md5(pass)));
      const sqlStr = `
         UPDATE users
         SET PASSWORD='${md5(md5(pass))}',
             modify_time ='${moment().format('YYYY-MM-DD HH:mm:ss')}'
         WHERE id='${id}'
      `;
      const result = await db.query(sqlStr);
      // console.log(result);
      const [user] = await db.query(`SELECT * FROM users WHERE id = ${id}`);
      // console.log(user)
      res.status(201).json(user)
   } catch (err) {
      next(err)
   }
};

//删除用户
exports.destroy =async (req,res,next)=>{
   try {
      //获取请求体,拿到当前需要被删除的用户的id
      const {id} = req.params;

      //根据当前id去删除对应的用户
      const sqlStr =
          `DELETE FROM users 
          where id=${id}`;

      //执行sql语句
      const result = await db.query(sqlStr);

      //删除成功之后，返回空对象
      res.status(201).json({})
   } catch (err) {
      next(err)
   }

};